package cmd

import (
	"fmt"
	"log"
	"time"

	"gorm.io/gorm"

	"BookStack/internal/domain/article"
)

// 示例文章状态
const (
	SampleArticleStatusPublished = 1 // 已发布状态
)

// 示例文章分类
const (
	SampleCategoryAbout = 1 // 关于我们分类
	SampleCategoryLegal = 2 // 法律文档分类
)

// 示例文章结构
type sampleArticle struct {
	Title      string
	Content    string
	Summary    string
	CategoryID uint
	AuthorID   uint
	Slug       string
}

// CreateSampleArticles 创建示例文章
func CreateSampleArticles(db *gorm.DB) error {
	log.Println("正在创建示例文章...")

	// 获取管理员ID（用于设置文章作者）
	var adminUser struct {
		ID uint
	}
	if err := db.Table("users").Select("id").Where("role = ?", "superadmin").First(&adminUser).Error; err != nil {
		return fmt.Errorf("查询管理员账户失败: %v", err)
	}

	adminID := adminUser.ID
	if adminID == 0 {
		return fmt.Errorf("未找到管理员账户")
	}

	// 示例文章集合
	sampleArticles := []sampleArticle{
		{
			Title:      "BookStack使用指南",
			Slug:       "bookstack-guide",
			CategoryID: SampleCategoryAbout,
			Summary:    "BookStack知识管理系统的功能介绍和使用方法。",
			Content:    getBookStackGuideContent(),
			AuthorID:   adminID,
		},
	}

	now := time.Now()

	// 逐个创建示例文章
	for _, sample := range sampleArticles {
		// 检查文章是否已存在
		var count int64
		db.Model(&article.Article{}).Where("slug = ?", sample.Slug).Count(&count)
		if count > 0 {
			log.Printf("文章'%s'已存在，跳过创建\n", sample.Title)
			continue
		}

		// 创建新文章实体
		newArticle, err := article.NewArticle(
			sample.Title,
			sample.Content,
			sample.Summary,
			sample.AuthorID,
			sample.CategoryID,
			"",          // 默认无封面图片
			sample.Slug, // 添加自定义slug参数
		)
		if err != nil {
			return fmt.Errorf("创建示例文章'%s'失败: %v", sample.Title, err)
		}

		// 发布文章
		if err := newArticle.Publish(); err != nil {
			return fmt.Errorf("发布示例文章'%s'失败: %v", sample.Title, err)
		}

		// 不需要再设置slug，因为已经在创建时设置
		// newArticle.Slug = sample.Slug

		// 设置创建和发布时间
		newArticle.CreatedAt = now
		newArticle.UpdatedAt = now
		newArticle.PublishedAt = now

		// 保存到数据库
		if err := db.Create(newArticle).Error; err != nil {
			return fmt.Errorf("保存示例文章'%s'失败: %v", sample.Title, err)
		}

		log.Printf("示例文章'%s'创建成功\n", sample.Title)
	}

	log.Println("示例文章创建完成")
	return nil
}

// 以下是示例文章内容

// getBookStackGuideContent BookStack使用指南内容
func getBookStackGuideContent() string {
	return `
# BookStack使用指南

欢迎使用BookStack知识管理系统！本指南将帮助您快速了解和使用BookStack的核心功能。

## 什么是BookStack？

BookStack是一个现代化的知识管理和文档协作平台，专为团队和个人设计，旨在简化知识的组织、分享和访问。无论是技术文档、内部知识库还是个人笔记，BookStack都能提供直观的体验。

## 核心功能

### 1. 文章管理

BookStack的基本内容单元是文章。您可以：

- **创建文章**：支持Markdown编辑器，轻松格式化内容
- **组织文章**：通过分类系统组织文章，便于查找
- **版本控制**：自动保存编辑历史，随时恢复先前版本
- **协作编辑**：多人可同时编辑和审阅内容

### 2. 用户系统

BookStack提供完善的用户管理功能：

- **用户注册和认证**：安全的账户系统保护您的内容
- **权限管理**：细粒度的权限控制，确定谁可以查看、编辑或管理内容
- **个人资料**：自定义用户资料，展示专业形象
- **活动记录**：跟踪用户参与和贡献

### 3. 搜索与发现

强大的搜索功能让知识触手可及：

- **全文搜索**：快速查找文章内的任何关键词
- **标签系统**：通过标签组织和发现相关内容
- **最近更新**：了解最新的知识动态
- **热门内容**：发现最受欢迎的文章和资源

### 4. 导入和导出

BookStack支持多种格式的内容交换：

- **Markdown导入/导出**：与其他Markdown工具无缝集成
- **PDF导出**：生成专业的PDF文档，便于分享和打印
- **HTML导出**：创建可发布的网页版本
- **批量操作**：高效管理大量内容

## 入门指南

### 第一步：注册账户

1. 访问BookStack首页
2. 点击右上角的"注册"按钮
3. 填写用户名、电子邮件和密码
4. 验证您的电子邮件地址

### 第二步：探索界面

登录后，您将看到主界面：

- **顶部导航栏**：搜索、通知和用户菜单
- **侧边栏**：分类、标签和系统链接
- **内容区**：显示文章列表或文章内容
- **操作按钮**：创建、编辑和管理内容的工具

### 第三步：创建第一篇文章

1. 点击"新建文章"按钮
2. 选择合适的分类
3. 输入标题和内容
4. 使用Markdown格式化工具美化文章
5. 点击"保存"或"发布"

### 第四步：组织内容

随着内容增加，您可以：

1. 创建新分类整理文章
2. 添加标签增强可发现性
3. 设置权限控制内容访问
4. 创建收藏夹整理重要文章

## 高级功能

### API集成

BookStack提供完整的REST API，支持与其他系统集成：

- 自动化内容更新
- 与工作流工具集成
- 构建自定义报告
- 开发扩展应用

### 自定义主题

管理员可以根据组织需求自定义平台外观：

- 品牌定制
- 布局调整
- 颜色方案
- 自定义CSS

### 插件系统

通过插件扩展BookStack功能：

- 增强编辑器功能
- 添加新的内容类型
- 集成第三方服务
- 自定义工作流

## 最佳实践

### 内容组织

- 使用清晰的分类结构
- 保持标题具有描述性
- 为重要内容添加摘要
- 适当使用标签增强可发现性

### 协作工作

- 建立内容审核流程
- 使用评论功能讨论内容
- 定期更新过时信息
- 为团队成员分配明确的责任

### 安全考虑

- 使用强密码保护账户
- 定期检查访问权限
- 备份重要内容
- 监控可疑活动

## 获取帮助

如果您需要更多帮助：

- **文档中心**：访问 help.bookstack.example.com 获取详细指南
- **社区论坛**：在 forum.bookstack.example.com 与其他用户交流
- **技术支持**：向 support@bookstack.example.com 发送邮件
- **培训服务**：企业用户可获取定制培训课程

祝您使用BookStack愉快！

最后更新：2023年12月15日
`
}
